package com.seur.web.cliente;

import com.seur.error.ExcepcionGeneral;
import com.seur.ldap.error.SEURLdapException;
import com.seur.ldap.objetos.Atributo;
import com.seur.ldap.objetos.Entrada;
import com.seur.modelo.Persistencia;
import com.seur.util.ComponenteDinamico;
import com.seur.util.Constantes;
import com.seur.util.GestorProperties;
import com.seur.util.ParseadorPantallas;
import com.seur.web.buscador.PantallaAtributosDinamicos;
import com.seur.web.plantillas.AtributoLista;
import com.seur.web.plantillas.CampoFiltro;
import com.seur.web.util.Mensajes;
import org.apache.log4j.Logger;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zul.Separator;
import org.zkoss.zul.Window;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: Eco
 * Date: 15-jun-2009
 * Time: 13:44:50
 * To change this template use File | Settings | File Templates.
 */

/**
 * Esta clase define la funcionalidad y aspecto del formulario de creacion de cliente
 */
public class VentanaCreaCliente extends Window implements PantallaAtributosDinamicos {
    private Logger trazador = Logger.getLogger(this.getClass().getName());
    private Window vCamposNuevoCliente;
    Entrada entrada;
    Atributo objectClass = new Atributo("objectClass");
    Map<String,String> nuevoCliente = new HashMap<String,String>();

    public void onCreate(){
        ParseadorPantallas parser = null;
        try {
            vCamposNuevoCliente = (Window)getFellow("camposNuevoCliente");
            parser = new ParseadorPantallas(GestorProperties.dameValor("paths.configuracionPantallas"),true);
            List<ComponenteDinamico> componentes = parser.obtenerComponentes(Constantes.VENTANA_CREAR_CLIENTE);

            for (ComponenteDinamico c:componentes){
                HashMap<String,String> param = new HashMap<String,String>();
                param.put("atributo", c.getNombre());
                CampoFiltro filtro;

                if (c.getTipo()== Constantes.COMPONENTE_CAMPO_FILTRO){
                    filtro = (CampoFiltro) Executions.createComponents(c.getFuente(), vCamposNuevoCliente, param);
                    filtro.asignar(c.getNombre(),c.getDescripcion(),"");
                }else if(c.getTipo()==Constantes.COMPONENTE_ATRIBUTO_LISTA){
                    AtributoLista al = (AtributoLista)Executions.createComponents(c.getFuente(), this, null);
                    al.setComponenteDinamico(c);
                }
                new Separator().setParent(this);
            }
        } catch (ExcepcionGeneral excepcionGeneral) {
            trazador.error(excepcionGeneral.toString());
        } catch (Exception e) {
            trazador.error(e.toString());
        }
    }

    /**
     * Este metodo recoge los datos para crear una nueva entrada de cliente en el ldap
     */
    public void crear(){
        try {
            String perfil = (String)Sessions.getCurrent().getAttribute("perfil");
            Entrada entrada = (Entrada)Sessions.getCurrent().getAttribute("entrada");
            String franquicia = "";
            vCamposNuevoCliente = (Window)getFellow("camposNuevoCliente");
            String dn = null;

            List<Component> hijos = vCamposNuevoCliente.getChildren();

            //Map<String,String> nuevoCliente = new HashMap<String,String>();
            for(Component c: hijos){
                CampoFiltro filtro = (CampoFiltro)c;
                //AtributoLista al = (AtributoLista)c;
                if (!filtro.getValor().equalsIgnoreCase("")){
                    if(filtro.getNombre().equalsIgnoreCase("seurCodigoOficina")){
                        if(perfil.equalsIgnoreCase(Constantes.NOMBRE_PERFIL_OPERADOR_FRANQUICIA) || perfil.equalsIgnoreCase(Constantes.NOMBRE_PERFIL_ADMINISTRADOR_FRANQUICIA)){
                            franquicia = entrada.getAtributoEntrada("seurCodigoOficina").getStringValor();
                            nuevoCliente.put(filtro.getNombre(),franquicia);
                        }else{
                            nuevoCliente.put(filtro.getNombre(),filtro.getValor());
                        }
                    }else{
                        nuevoCliente.put(filtro.getNombre(),filtro.getValor());
                    }
                }
                if(filtro.getNombre().equalsIgnoreCase("givenName")){
                    dn = "cn=" + filtro.getValor() + ",ou=CLIENTES,ou=USEREXT,o=seur";
                }
            }
            entrada = new Entrada(dn);
            if(objectClass.getStringValores().length == 0){
                Mensajes.mostrarInfo("Debe introducir los valores necesarios para objectClass antes de crear el usuario");
            }else{
                entrada.addAtributo(objectClass);
                //se envia el map para la creacion del actor
                Persistencia.crearActor(entrada, nuevoCliente);
            }

        } catch (Exception excepcion) {
            trazador.error("VentanaCreaCliente:crear() Se ha producido un error al crear el actor, excepcion:" + excepcion);
            Mensajes.mostrarError("Se ha producido un error al crear el cliente, por favor contacte con el Administrador");
        }
                
    }

    public void modificarAtributo(String nombreAtributo, String nuevoValor) throws ExcepcionGeneral, SEURLdapException {

    }

    public void eliminarAtributo(String nombreAtributo) throws ExcepcionGeneral, SEURLdapException {

    }

    public void eliminarValorAtributo(String nombreAtributo, String valor) throws ExcepcionGeneral, SEURLdapException {
        //nuevoCliente.remove(valor);
        objectClass.eliminarValor(valor);
        //Atributo atributo = new Atributo("objectClass");
        //atributo.eliminarValor(valor);
    }

    public void anyadirValorAtributo(String nombreAtributo, String valor) throws ExcepcionGeneral, SEURLdapException {
        //nuevoCliente.put(nombreAtributo,valor);
        objectClass.addValor(valor);
        //Atributo atributo = new Atributo("objectClass");
        //atributo.addValor(valor);
        //entrada.addAtributo(atributo);
    }

    public void modificarClave(String clave) throws ExcepcionGeneral, SEURLdapException {
        //To change body of implemented methods use File | Settings | File Templates.
    }

}
